package com.fiume.travel.service.impl;

import com.fiume.travel.mapper.UserMapper;
import com.fiume.travel.pojo.User;
import com.fiume.travel.pojo.UserExample;
import com.fiume.travel.service.UserService;
import com.fiume.travel.utils.BeanConv;
import com.fiume.travel.utils.EmptyUtil;
import com.fiume.travel.utils.MD5Coder;
import com.fiume.travel.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * <p>
 * Description: 用户服务实现类
 * </p>
 *
 * @author fiume
 * @version v1.0.0
 * @create 2021-02-13 20:24
 * @see com.fiume.travel.service
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;

    @Resource
    private HttpSession httpSession;
    /**
     * 用户注册
     *
     * @param userVo 前端传入值
     * @return 是否注册成功
     */
    @Override
    public Boolean userRegister(UserVo userVo) {
        //Vo -> pojo
        User user = BeanConv.toBean(userVo, User.class);
        //加密即将存入数据库的密码
        user.setPassword(MD5Coder.md5Encode(userVo.getPassword()));
        //Fixme: 测试 稍后删除
        System.out.println("测试转换是否成功user = " + user);
        //将数据存入数据库中
        int i = userMapper.insertSelective(user);
        return i > 0;
    }

    /**
     * 用户登入
     *
     * @param userVo
     * @return 登录后将前端需要的一些信息返回
     */
    @Override
    public UserVo userLogin(UserVo userVo) {
        // 将前端传入的密码加密后与数据库存的密码比对,成功返回所需对象,失败返回错误
        //根据传入的用户的用户名查询到对应的用户
        UserExample example = new UserExample();
        example.createCriteria()
                .andUsernameEqualTo(userVo.getUsername())
                .andPasswordEqualTo(MD5Coder.md5Encode(userVo.getPassword()));
        List<User> userList = userMapper.selectByExample(example);
        // FIXME: 可否为DTO
        UserVo resultUserVo = null;
        //判断登录是否成功
        if (userList.size() > 0 ){
            //成功,这里偷懒了 确保拿出的数据一定是一条数据,getOne可拿出一条数据,但是当结果不唯一时会报错,这一系列操作的目的是不报错并拿出想要的结果
            // FIXME: 可以的话 后期采用Mybatis-plus进行操作 可以通过其getOne拿到一个User对象.
            User user = userList.get(0);
            //User -> UserVo
            resultUserVo = BeanConv.toBean(user, UserVo.class);
            // 保存成功状态,将之存入session中
            String sessionId = httpSession.getId();
            // 将存放到session中用户对象的唯一标识存入返回值中, 下次再访问时通过sessionId获取session,相当于在银行办张银行卡,下回通过该卡卡号就可知道我是谁.
            resultUserVo.setSessionId(sessionId);
            httpSession.setAttribute(sessionId,resultUserVo);
        }
        //成功返回user 失败返回null
        return resultUserVo;
    }

    /**
     * 用户登出
     */
    @Override
    public void userLoginOut() {
        String sessionId = httpSession.getId();
        httpSession.removeAttribute(sessionId);
    }

    /**
     * 查询用户是否登录
     *
     * @return
     */
    @Override
    public Boolean isLogin() {
        String sessionId = httpSession.getId();
        Object userVo = httpSession.getAttribute(sessionId);
        return !EmptyUtil.isNullOrEmpty(userVo);
    }
}
